<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    

    <script>
       //   https://blog.csdn.net/xuyuanfan/article/details/132677758 JS中this的9种指向详解
        
        // 一、普通函数：
        //1、全局直接调用函数时，在非严格模式中，函数中的this代表着全局对象window或者global，在严格模式中，函数中的this为undefined。
        // function angry_it_man_1(){
        //     // "use strict" //，在严格模式中 undefined
        //     if(this == undefined){
        //         console.log('欢迎关注微信公众号：愤怒的it男');
        //     }else{
        //         console.log(this); //Window 
        //     }
        // };
        // angry_it_man_1();

        //2.通过对象调用方法时，对象方法中的this代表着该对象。
        // var name = '欢迎关注微信公众号：愤怒的it男';
        // var angry_it_man_2 = {
        //     name : '欢迎关注微信公众号：angry_it_man',
        //     say : function(){
        //         return this.name;
        //     },
        // }
        // console.log(angry_it_man_2.say()); // 对象中的this指向angry_it_man对象
        // f = angry_it_man_2.say; // 将对象中的say抽离 , 一旦抽离出来 指向 window
        // console.log(f()); // 对象中的this指向全局对象window或者global

        //3、使用构造函数创建对象时，构造函数中的this代表着new出来的对象。
        // var name = '欢迎关注微信公众号：愤怒的it男';
        // var Angry_IT_Man = function(){
        //     this.name = '欢迎关注微信公众号：angry_it_man';
        //     this.say = function(){
        //         return this.name;
        //     }
        // }
        
        // var angry_it_man = new Angry_IT_Man();
        // console.log(angry_it_man.say()); // 对象中的this指向angry_it_man对象
        // f = angry_it_man.say; // 将对象中的say抽离
        // console.log(f()); // 对象中的this指向全局对象window或者global

        //4.使用call、apply、bind绑定的，this指向绑定的对象。
        // var angry_it_man1 = {
        // name: '欢迎关注微信公众号：愤怒的it男',
        // }
        // var angry_it_man2 = {
        // name: '欢迎关注微信公众号：angry_it_man',
        // }
        // var say = function (){
        //     return this.name;
        // }
        // console.log(say.call(angry_it_man1));
        // console.log(say.apply(angry_it_man2));


     //箭头函数：
        // var name = '欢迎关注微信公众号：愤怒的it男';
        // var Angry_IT_Man = function(){
        // this.name = '欢迎关注微信公众号：angry_it_man';
        // this.say = ()=>{return this.name;};
        // }
        // var angry_it_man = new Angry_IT_Man() 
        // console.log(angry_it_man.say()) // 对象中的this指向angry_it_man对象
        
        // f = angry_it_man.say; // 将对象中的say抽离
        // console.log(f()) // 箭头函数的this固定指向angry_it_man

        //如果箭头函数的定义不在任何函数中，则其this为全局对象
        // var name = '欢迎关注微信公众号：愤怒的it男';
        // var angry_it_man = ()=>{
        // this.name = '欢迎关注微信公众号：angry_it_man';
        // }
        // angry_it_man(); // 箭头函数是在最外围创造的，因此其this指向window
        // console.log(this)

        //setInterval 中传入的函数，this会100% 指向全局对象window或者global。 setTimeout 中传入的函数，this会100% 指向全局对象window或者global。
        var name = '欢迎关注微信公众号：愤怒的it男';
        var angry_it_man = {
        name: '欢迎关注微信公众号：angry_it_man',
        say: function() {
            setTimeout(function(){
            console.log(this.name);
            },3000)
        }
        } 
        
        angry_it_man.say();

        // https://blog.csdn.net/qq_46302247/article/details/123699151 箭头函数 出现在 定时器(setTimeout)中

        // null 
        // Number
        // String
        // bollean
        // Object
        // Symbol
        // undefined
    </script>
</body>
</html>